package com.vxdata

import scala.collection.mutable.ArrayBuffer

object 函数_4_高阶函数案例 {
  /**
   * 需求：模拟 Map 映射、Filter 过滤、Reduce 聚合
   *
   * @param args
   */
  def main(args: Array[String]): Unit = {

    /**
     * map 映射
     *
     * @param arr Int数组
     * @param op  匿名函数
     * @return 1,4,9,16
     */
    def map(arr: Array[Int], op: Int => Int) = {
      // 返回值是 op匿名函数的执行结果
      for (elem <- arr) yield op(elem)
    }

    // 调用map函数, 传递两个参数, 一个是数组, 另外一个是匿名函数的执行逻辑
    val arr = map(Array(1, 2, 3, 4), (x: Int) => {
      x * x
    })
    println(arr.mkString(","))


    // （2）filter 过滤。有参数，且参数再后面只使用一次，则参数省略且 后面参数用_表示

    /**
     * Filter 过滤
     *
     * @param arr
     * @param op
     * @return
     */
    def filter(arr: Array[Int], op: Int => Boolean) = {
      var arr1: ArrayBuffer[Int] = ArrayBuffer[Int]()
      for (elem <- arr if op(elem)) {
        arr1.append(elem)
      }
      arr1.toArray
    }

    var arr1 = filter(Array(1, 2, 3, 4), _ % 2 == 1)
    println(arr1.mkString(","))

    // （3）reduce 聚合。有多个参数，且每个参数再后面只使用一次，则参 数省略且后面参数用_表示，第 n 个_代表第 n 个参数
    def reduce(arr: Array[Int], op: (Int, Int) => Int) = {
      var init: Int = arr(0)
      for (elem <- 1 until arr.length) {
        init = op(init, elem)
      }
      init
    }

    //val arr2 = reduce(Array(1, 2, 3, 4), (x, y) => x * y)
    val arr2 = reduce(Array(1, 2, 3, 4), _ * _)
    println(arr2)
  }

}
